【小ネタ】AdministratorAccessがアタッチされているIAMユーザーでMFAが有効になっているかチェックする
こんにちはonz(オンジー)です!
AdministratorAccessがアタッチされているIAMユーザーでMFAが有効になっているか?をチェックするスクリプトを書く機会があり、もしかしたら誰か使う機会があるかもと思ったので置いておきます。
IAMユーザー一覧からMFAが有効になっているかをチェックするだけであればIAMの認証情報レポートで可能です。
またAWS Configのマネージドルールには「IAM ユーザーが MFA を設定しているか」「ルートユーザーが MFA を設定しているか」といったルールがあります。
これらでやりたいチェックできなかったので書きました。
前提
- aws cli が使える
- profileが用意されている(スクリプト内で指定してます)
- jqコマンドが使える
- bashが使える
スクリプト
#!/bin/bash +e # PROFILE={PROFILE} declare -a ADMIN_USERS declare -a WARNING_USERS AWS_ACCOUNT_ID=$(aws sts --profile ${PROFILE} get-caller-identity | jq -r '.Account') user_names=$(aws iam --profile ${PROFILE} list-users | jq -r '.Users[].UserName') for user_name in $user_names; do login_profile=$(aws iam --profile ${PROFILE} get-login-profile --user-name $user_name 2>/dev/null) if [ $? -eq 0 ]; then list=$(aws iam --profile ${PROFILE} list-attached-user-policies --user-name $user_name --query 'AttachedPolicies[].PolicyArn') for policy in $list; do if [ "$(echo $policy | grep AdministratorAccess)" ]; then # AdministratorAccessを持ったユーザー echo "$AWS_ACCOUNT_ID - $user_name has AdministratorAccess" ADMIN_USERS+=($user_name) fi done fi # グループに紐づいてるAdmin権限もチェックする groups=$(aws iam --profile ${PROFILE} list-groups-for-user --user-name $user_name | jq -r '.Groups[].GroupName') for group in $groups; do list=$(aws iam --profile ${PROFILE} list-attached-group-policies --group-name $group --query 'AttachedPolicies[].PolicyArn') for policy in $list; do if [ "$(echo $policy | grep AdministratorAccess)" ]; then # AdministratorAccessを持ったユーザー echo "$AWS_ACCOUNT_ID - $user_name has AdministratorAccess" ADMIN_USERS+=($user_name) fi done done done # MFAが有効になってるかのチェック for admin_user in ${ADMIN_USERS[@]}; do len=$(aws iam --profile ${PROFILE} list-mfa-devices --user-name $admin_user | jq -r '.MFADevices | length') if [ $len == "0" ]; then # MFAデバイスの紐づきが無い echo "$AWS_ACCOUNT_ID - $admin_user do NOT have MFA Devices" WARNING_USERS+=($admin_user) else # ユーザーに最低一つのMFAデバイスが紐づいてる echo "$AWS_ACCOUNT_ID - $admin_user has MFA Devices" fi done echo "------------!!Warning!!------------" for i in ${WARNING_USERS[@]}; do echo $i done
(もっと綺麗にかけそう)
補足
AdministratorAccess以外のポリシーでも置き換えれば使えます。
なお今回はとりあえずチェックするための手段だったのですが、実際にIAMユーザーのMFAで適切な状態を維持する方法については次の記事がとても参考になります。